/*
 * Copyright (C) 2012 POAS.VSTU
 */
package model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/** Контейнер "кольцо" */
public class CircularBuffer<E> implements Collection<E> {

    /// Элементы кольца
    private ArrayList<E> mElements = new ArrayList<>();

    /**
     * Добавить элемент в кольцо.
     * @param element элемент для добавления
     * @return true, если элемент был добавлен
     */
    public boolean add(E element) {
        return mElements.add(element);
    }

    /**
     * Добавить элементы коллекции в кольцо.
     * @param c коллекция для добавления
     * @return boolean true, если элемент был добавлен
     */
    @Override
    public boolean addAll(Collection<? extends E> c) {
        return mElements.addAll(c);
    }

    @Override
    public Iterator iterator() {
        return new RingIterator();
    }

    public Object[] toArray() {
        return mElements.toArray();
    }

    @Override
    public int size() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean isEmpty() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean contains(Object o) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public <T> T[] toArray(T[] a) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean remove(Object o) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void clear() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /** Итератор для контейнера "кольцо" */
    public class RingIterator<E> implements Iterator<E> {

        private int cursor = 0;       // index of next element to return
        private int lastRet = -1; // index of last element returned; -1 if no such

        /**
         * Узнать, есть ли следующий элемент в кольце.
         * @return true, если в кольце есть хотя бы 1 элемент
         */
        @Override
        public boolean hasNext() {
            return (mElements.size() > 0);
        }

        /**
         * Получить следующий элемент.
         * @return следующий элемент
         */
        @Override
        public E next() {
            if (cursor < mElements.size() - 1) {
                lastRet = cursor;
                cursor++;
                return (E) mElements.get(lastRet);
            }
            else {
                if (cursor == mElements.size() - 1){
                    lastRet = cursor;
                    cursor = 0;
                    return (E) mElements.get(lastRet);
                }
            }
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }
}
